// 账号表 维护账号数据， 主要由登录服务器操作
package db

import (
	"time"
	"gopkg.in/mgo.v2/bson"
	"github.com/name5566/leaf/log"
	"message"
)

const (
	TBL_ACCOUNT = "tbl_account"    // 表名
)

// 玩家的数据结构，对应数据库中的tbl_user表
type AccountData struct {
	EntityID    bson.ObjectId  `bson:"_id"`
	AccountID   int        `bson:"account_id"`   // 玩家id 实际游戏中通过这个id识别玩家（尤其是跟客户端交互的时候），这是一个自增的id
	Account     string        `bson:"account"`   // 账户名，如果是第三方登录则为第三方id，如果是默认登录则为udid
	Password    string    `bson:"password"`      // 密码，第三方登录和游客登录不需要密码
	AccountType int        `bson:"account_type"` // 账户类型 0代表账号密码登录  1代表游客登录 2以上代表第三方平台登录
	CreateTime  int64    `bson:"create_time"`    // 注册时间
	LoginTime   int64        `bson:"login_time"` // 上次登录时间
}

func initAccount() {
	DBEnsureIndex(TBL_ACCOUNT, "account", true)
	DBEnsureCounter(TBL_ACCOUNT, 1000)
}


// 先用同步的方式，将来修改为异步的
func FindAccount(account string) *AccountData {
	return DBFind(TBL_ACCOUNT, bson.M{"account" : account}, &AccountData{}).(*AccountData)
}

// 创建一个新的玩家
func CreateAccount(account string, password string, accountType message.LoginType) *AccountData {
	// 查找是否存在此账户
	data := FindAccount(account)
	if data != nil {
		// 正确的查找到的玩家，则此玩家已经存在，不能创建
		log.Error("CreateAccount Error, Account Exist:  %s  %s", account, password)
		return nil
	}

	// 账户id
	accountID, err := DBNextSeq(TBL_ACCOUNT)
	if err != nil {
		log.Error("无法获取AccountID")
		return nil
	}

	// 新的账户数据
	data = &AccountData{
		EntityID:bson.NewObjectId(),
		Account:account,
		Password:password,
		CreateTime:time.Now().Unix(),
		AccountType:int(accountType),
		AccountID:accountID,
	}

	// 插入数据
	if err := DBInsert(TBL_ACCOUNT, data); err != nil {
		log.Error("无法插入数据:  %v", err)
		return nil
	}
	return data
}

// 将玩家数据存储到数据库中
func SaveAccount(accountData *AccountData) {
	DBSave(TBL_ACCOUNT, accountData.EntityID, accountData)
}